package com.tedu.springboot2206.controller;

import com.tedu.springboot2206.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 用户控制器
 */
//注解:MVC关注的内容
    @Controller
public class UserController {
        //表示保存所有用户信息的目录users
        private static File userDir;

        static {
            userDir = new File("./users");
            if (!userDir.exists()){
                userDir.mkdirs();
            }
        }
    /**
     *
     * @param request  请求对象,封装着浏览器发送过来的所有内容
     * @param response 响应对象,封装着我们即将给浏览器回复的内容
     */
    //注册用户
    @RequestMapping("/regUser")
    public void reg(HttpServletRequest request, HttpServletResponse response){
        /*
        * 处理注册的大致过程
        * 1.获取用户在注册页面输入的注册信息(通过请求对象获取浏览器提交的表单数据)
        * 2.处理注册
        * 3.设置响应对象，将处理结果回馈给浏览器*/
        /*
            HttpServletRequest的重要方法:
            String getParameter(String name)
            获取浏览器传递过来的某个参数的值
            这里的传入的是参数名，对应的是页面表单输入框的名字(name属性对应的值)
         */
        //1.获取注册页面上的表单信息
        String userName = request.getParameter("userName").trim();
        String password = request.getParameter("password");
        String nickName = request.getParameter("nickName");
        String agestr = request.getParameter("age");
        /*String username = request.getParameter("username");
        * 作用:获取浏览器传递过来的参数username对应的值
        * 返回的字符串可能存在2种特殊情况:
        * 1.没有输入内容,获得内容为空
        * 2.输入内容为""*/
        //验证信息不为空
        if (userName == null || userName.isEmpty() || password == null || password.isEmpty() ||
            nickName == null || nickName.isEmpty() ||agestr == null || agestr.isEmpty() || !agestr.matches("[0-9]+")){
            try {
                response.sendRedirect("/reg_info_error.html");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        }
//        int age = Integer.valueOf(agestr);
        int age = Integer.parseInt(agestr);//将年龄转化为int值
        /*2.将该注册用户信息以User对象形式表示并序列化到文件中保存
        将来所有的保存用户信息的文件都统一放在users目录下,并且每个保存用户的文件的名字格式:用户名.obj
         */
        User user = new User(userName,password,nickName,age);
        System.out.println(user);
        /*
            File的重载构造器
            File(File parent,String child)
            该File对象表达的是在parent表示的目录中的子项child
         */
        //在userDir(该对象表达当前项目目录下的users目录)目录中的文件xxx.obj(xxx就是当前注册用户名)
        File file = new File(userDir,userName+".obj");
        //判断文件是否存在
        if (file.exists()){
            System.out.println("文件已存在");
            try {
                response.sendRedirect("/have_user.html");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        }
        try(
                FileOutputStream fos = new FileOutputStream(file);
                ObjectOutputStream oos = new ObjectOutputStream(fos);
        ) {
            oos.writeObject(user);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //重定向新页面
        try {
            /*
                让浏览器重定向到指定的路径查看处理结果页面
                这里的路径"/reg_success.html"是发送给浏览器让其理解的.
                所以浏览器还是当这里的"/"为抽象路径中第一个"/"的位置
                相当于浏览器会根据该路径请求:
                http://localhost:8080/reg_success.html
             */
            response.sendRedirect("/reg_success.html");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //用户登录
    @RequestMapping("/loginUser")
    public void login(HttpServletRequest request,HttpServletResponse response){
        //获取登录页面信息
        String userName = request.getParameter("userName");
        String password = request.getParameter("password");
        System.out.println(userName+","+password);
        //判断信息是否有效
        if (userName == null || userName.isEmpty() || password == null || password.isEmpty()){
            try {
                response.sendRedirect("/login_info_error.html");
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("用户输入不正确");
            return;
        }
        //获取用户.obj文件
        File file = new File(userDir,userName+".obj");
        if (!file.exists()){
        //文件存在后,读取文件信息
        try(FileInputStream fis = new FileInputStream(file);
            ObjectInputStream ois = new ObjectInputStream(fis);
            ) {
            User user = (User) ois.readObject();
            System.out.println(user);
            if (user.getPassword().equals(password)){
                response.sendRedirect("/login_success.html");
                return;
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        }
        //登录失败
        try {
            response.sendRedirect("/login_fail.html");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    //获取所有用户信息
    @RequestMapping("/userList")
    public void getUsers(HttpServletRequest request,HttpServletResponse response){
        //用户列表
        List<User> userList = new ArrayList<>();
        //获取user目录下的所有obj文件
        File[] subs = userDir.listFiles(f->f.getName().endsWith(".obj"));
        //将每个文件反序列化
        for (File sub:subs) {
            try (FileInputStream fis = new FileInputStream(sub);
                 ObjectInputStream ois = new ObjectInputStream(fis)){
                User user = (User)ois.readObject();
                userList.add(user);
            } catch (IOException | ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        System.out.println(userList);
        try {
            /*setContentType()设置页面的读方式,会自动关闭里面的流*/
            response.setContentType("text/html;charset=utf-8");
            PrintWriter pw = response.getWriter();
            /*String s = "<!DOCTYPE html>\n" +
                    "<html lang=\"en\">\n" +
                    "    <head>\n" +
                    "        <meta charset=\"UTF-8\">\n" +
                    "        <title>我的首页</title>\n" +
                    "\n" +
                    "    </head>\n" +
                    "    <body>\n"+"<center>\n" +
                    "<h1>用户列表</h1>\n" +
                    "<table border = \"1\">\n" +
                    "</table>" +
                    "</center>\n"+"</body>\n" +
                    "</html>";

            pw.println(s);*/
            pw.println("<!DOCTYPE html>");
            pw.println("<html lang=\"en\">");
            pw.println("<head>");
            pw.println("<meta charset=\"UTF-8\">");
            pw.println("<title>用户列表</title>");
            pw.println("</head>");
            pw.println("<body>");
            pw.println("<center>");
            pw.println("<h1>用户列表</h1>");
            pw.println("<table border=\"'1\">");
            pw.println("<tr>");
            pw.println("<td>用户名</td>");
            pw.println("<td>密码</td>");
            pw.println("<td>昵称</td>");
            pw.println("<td>年龄</td>");
            pw.println("<td>操作</td>");
            pw.println("</tr>");
            for (User user : userList) {
                pw.println("<tr>");
                pw.println("<td>"+user.getUserName()+"</td>");
                pw.println("<td>"+user.getPassword()+"</td>");
                pw.println("<td>"+user.getNickName()+"</td>");
                pw.println("<td>"+user.getAge()+"</td>");
                pw.println("<td><a href='/delUser?userName="+user.getUserName()+"'>删除</a></td>");
                pw.println("</tr>");
            }
            pw.println("<tr>");
            pw.println("<td colspan = \"4\" align='right'><a href=\"index.html\">回到首页</a></td>");
            pw.println("</tr>");
            pw.println("</table>");
            pw.println("</center>");
            pw.println("</body>");
            pw.println("</html>");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    //删除用户
    @RequestMapping("/delUser")
    public void delUser(HttpServletRequest request,HttpServletResponse response){
        String userName = request.getParameter("userName");
        System.out.println(userName);
        new File(userDir,userName+".obj").delete();
        try {
            response.sendRedirect("/userList");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
